package cn.sy.service.impl;
import cn.sy.domain.Bom;
import cn.sy.domain.ProcessDetailted;
import cn.sy.domain.ProductionDetailed;
import cn.sy.domain.ProductionPlan;
import cn.sy.dto.ProcessDto;
import cn.sy.dto.ProductionPlanDto;
import cn.sy.exception.GlobalErrorCodeEnum;
import cn.sy.feign.BomFeignClien;
import cn.sy.mapper.ProductionPlanMapper;
import cn.sy.result.JSONResult;
import cn.sy.service.IProcessDetailtedService;
import cn.sy.service.IProductionDetailedService;
import cn.sy.service.IProductionPlanService;
import cn.sy.util.AssertUtil;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.Date;
import java.util.UUID;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author director
 * @since 2022-12-08
 */
@Service
@Transactional
@Slf4j
public class ProductionPlanServiceImpl extends ServiceImpl<ProductionPlanMapper, ProductionPlan> implements IProductionPlanService {
    @Autowired
    private IProductionDetailedService iProductionDetailedService;

    @Autowired
    private IProcessDetailtedService iProcessDetailtedService;

    @Autowired
    private BomFeignClien bomFeignClien;

    @Resource
    private ProductionPlanMapper productionPlanMapper;
    @Override
    @Transactional
    public void production(ProductionPlanDto productionPlanDto) {
        // 查询是否存在 
        ProductionPlan entity = productionPlanMapper.findByOrderRef(productionPlanDto.getOrderRef());
        if (entity != null) {
            if (entity.getStatus() == -1L) {
                // 订单编号
                entity.setOrderRef(productionPlanDto.getOrderRef());
                // 客户名称
                entity.setCustomerName(productionPlanDto.getCustomerName());
                // 产品名称
                entity.setProductName(productionPlanDto.getProductName());
                // 联系人
                entity.setContacts(productionPlanDto.getContacts());
                // 联系人电话
                entity.setContactPhone(productionPlanDto.getContactPhone());
                // 交货时间
                entity.setDeliveryDate(productionPlanDto.getDeliveryDate());
                //计划负责人负责人
                entity.setPlannerName(productionPlanDto.getPlannerName());
                // 计划负责人联系方式 邮箱通知
                entity.setPlannerEmail(productionPlanDto.getPlannerEmail());
                // 修改时间
                entity.setModifyTime(new Date());
                // 生成计划
                updateById(entity);
                ProcessDetailted processDetailted = iProcessDetailtedService.selectByProductionId(entity.getId());
                AssertUtil.isNotNull(processDetailted,GlobalErrorCodeEnum.SERVICE_PARAM_IS_NULL);
                // 通过id查找到审核员的电话发送短信
                log.info(processDetailted.getProcessName() + "订单编号为" + entity.getOrderRef() + "已经修改完成请及时审批！");
                ProductionDetailed productionDetailed = iProductionDetailedService.selectByProductionId(entity.getId());
                // 产品名称
                productionDetailed.setProductName(productionPlanDto.getProductName());
                // 订单数量
                productionDetailed.setOrderNumber(productionPlanDto.getOrderNumber());
                // 计划生产数
                productionDetailed.setPlanProductionNumber(productionPlanDto.getPlanProductionNumber());
                // 生产要点
                productionDetailed.setProductionPoints(productionPlanDto.getProductionPoints());
                // 备注
                productionDetailed.setRemarks(productionPlanDto.getRemarks());
                // 状态待审核
                productionDetailed.setStatus(0L);
                // 指定车间负责人
                productionDetailed.setDutyPerson(productionPlanDto.getDutyPerson());
                // 创建时间
                productionDetailed.setCreatTime(new Date());
                iProductionDetailedService.updateById(productionDetailed);
                log.info("计划详细修改完成！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！");
            }
            return;
        }
        // 生成计划
        ProductionPlan productionPlan = new ProductionPlan();
        // 订单编号
        productionPlan.setOrderRef(productionPlanDto.getOrderRef());
        // 客户名称
        productionPlan.setCustomerName(productionPlanDto.getCustomerName());
        // 产品名称
        productionPlan.setProductName(productionPlanDto.getProductName());
        // 联系人
        productionPlan.setContacts(productionPlanDto.getContacts());
        // 联系人电话
        productionPlan.setContactPhone(productionPlanDto.getContactPhone());
        // 交货时间
        productionPlan.setDeliveryDate(productionPlanDto.getDeliveryDate());
        //计划负责人负责人
        productionPlan.setPlannerName(productionPlanDto.getPlannerName());
        // 计划负责人联系方式 邮箱通知
        productionPlan.setPlannerEmail(productionPlanDto.getPlannerEmail());
        // 生成唯一计划编号
        productionPlan.setPlanNumber(UUID.randomUUID().toString());
        // 状态待审核
        productionPlan.setStatus(0L);
        // 创建时间
        productionPlan.setCreatTime(new Date());
        // 生成计划
        insert(productionPlan);
        log.info("计划生成完成！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！");
        // 生成详细表
        ProductionDetailed productionDetailed = new ProductionDetailed();
        // 产品名称
        productionDetailed.setProductName(productionPlanDto.getProductName());
        // 订单编号
        productionDetailed.setOrderRef(productionPlanDto.getOrderRef());
        // 计划id
        productionDetailed.settProctionId(productionPlan.getId());
        // 订单数量
        productionDetailed.setOrderNumber(productionPlanDto.getOrderNumber());
        // 计划生产数
        productionDetailed.setPlanProductionNumber(productionPlanDto.getPlanProductionNumber());
        // 生产要点
        productionDetailed.setProductionPoints(productionPlanDto.getProductionPoints());
        // 备注
        productionDetailed.setRemarks(productionPlanDto.getRemarks());
        // 状态待审核
        productionDetailed.setStatus(0L);
        // 指定车间负责人
        productionDetailed.setDutyPerson(productionPlanDto.getDutyPerson());
        // 创建时间
        productionDetailed.setCreatTime(new Date());
        iProductionDetailedService.insert(productionDetailed);
        log.info("计划详细生成完成！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！");
    }

    /**
     * 审核失败
     * @param processDto
     */
    @Override
    @Transactional
    public void processFail(ProcessDto processDto) {
        ProductionPlan productionPlan = selectById(processDto.getId());
        AssertUtil.isNotNull(productionPlan, GlobalErrorCodeEnum.SERVICE_PARAM_IS_NULL);
        // 修改状态
        productionPlan.setStatus(-1L);
        productionPlan.setModifyTime(new Date());
        updateById(productionPlan);
        // 修改生产详细表的状态
        ProductionDetailed productionDetailed = iProductionDetailedService.selectByProductionId(productionPlan.getId());
        AssertUtil.isNotNull(productionDetailed, GlobalErrorCodeEnum.SERVICE_PARAM_IS_NULL);
        productionDetailed.setModifyTime(new Date());
        productionDetailed.setStatus(-1L);
        iProductionDetailedService.updateById(productionDetailed);
        String email = productionPlan.getPlannerEmail();
        String plannerName = productionPlan.getPlannerName();
        // 发送短信
        // 通知计划人 修改生产计划
        log.info("短信发送成功" + plannerName + "订单编号为" + productionPlan.getOrderRef() + "生产计划审核失败");
        // 保存审核日志
        ProcessDetailted processDetailted = new ProcessDetailted();
        processDetailted.setCreatTime(new Date());
        processDetailted.setProcessId(processDto.getProcessId());
        processDetailted.setProductionId(productionDetailed.getId());
        processDetailted.setProcessReason(processDto.getProcessReason());
        processDetailted.setProcessName(processDto.getProcessName());
        processDetailted.setStatus(-1L);
        iProcessDetailtedService.insert(processDetailted);
        log.info("审核失败成功！");
    }

    @Override
    @Transactional
    public void processSuccess(ProcessDto processDto) {
        ProductionPlan productionPlan = selectById(processDto.getId());
        AssertUtil.isNotNull(productionPlan, GlobalErrorCodeEnum.SERVICE_PARAM_IS_NULL);
        // 修改状态
        productionPlan.setStatus(1L);
        productionPlan.setModifyTime(new Date());
        updateById(productionPlan);
        // 修改生产详细表的状态
        ProductionDetailed productionDetailed = iProductionDetailedService.selectByProductionId(productionPlan.getId());
        AssertUtil.isNotNull(productionDetailed, GlobalErrorCodeEnum.SERVICE_PARAM_IS_NULL);
        productionDetailed.setModifyTime(new Date());
        productionDetailed.setStatus(1L);
        iProductionDetailedService.updateById(productionDetailed);
        // 通知车间负责人 落实
        log.info("短信发送成功"+productionDetailed.getDutyPerson()+"订单编号为"+productionPlan.getOrderRef()+"生产计划开始请即使查阅并安排");
        // 保存审核日志
        ProcessDetailted processDetailted = iProcessDetailtedService.selectByProductionId(productionPlan.getId());
        AssertUtil.isNotNull(processDetailted,GlobalErrorCodeEnum.SERVICE_PARAM_IS_NULL);
        processDetailted.setCreatTime(new Date());
        processDetailted.setProcessId(processDto.getProcessId());
        processDetailted.setProcessReason(processDto.getProcessReason());
        processDetailted.setProcessName(processDto.getProcessName());
        processDetailted.setStatus(1L);
        iProcessDetailtedService.updateById(processDetailted);
        log.info("审核成功！");
    }

    @Override
    public JSONResult addBom(Bom bom) {
        return bomFeignClien.saveOrUpdate(bom);
    }

}
